/**
 * Defines the requirements of the priority queue ADT.
 * 
 * @param <T>
 *            The type of the elements in this priority queue
 */
public interface PriorityQueue<T extends Comparable<? super T>> {

	/**
	 * Adds an element to the priority queue.
	 * 
	 * @param element
	 *            The element to add
	 * @throws NullPointerException
	 *             If element is null
	 */
	public void add(T element);

	/**
	 * Removes the minimum element in the priority queue.
	 * 
	 * @return The minimum element in the priority queue
	 * @throws NoSuchElementException
	 *             If the priority queue is empty
	 */
	public T remove();

	/**
	 * Returns, but does not remove, the minimum element in the priority queue.
	 * 
	 * @return The minimum element in the priority queue
	 */
	public T peek();

	/**
	 * Determines if the priority queue is empty.
	 * 
	 * @return true if the priority queue is empty, or false otherwise
	 */
	public boolean isEmpty();

	/**
	 * Empties the priority queue.
	 */
	public void clear();

	/**
	 * Returns the number of elements in the priority queue.
	 * 
	 * @return The size of the priority queue
	 */
	public int size();

}